﻿// UDPReceiverSample.h: 标准系统包含文件的包含文件
// 或项目特定的包含文件。

#pragma once

// iperf2数据包分析功能开关
//#define ENABLE_IPERF2_ANALYSIS

// UDP缓冲区配置选项 - 根据系统内存和性能需求选择

/*
 * 缓冲区优化说明：
 * 
 * 1. 应用层缓冲区 (max_length × buffer_count)：
 *    - 用于并发处理多个数据包
 *    - 增加数量可提高并发性能，但占用更多内存
 *    - 单个大小固定为64KB（UDP实际最大值）
 * 
 * 2. 系统接收缓冲区 (SO_RCVBUF)：
 *    - 操作系统级别的数据包缓存
 *    - 防止高速率时的数据包丢失
 *    - 是最关键的防丢包设置
 * 
 * 3. 系统发送缓冲区 (SO_SNDBUF)：
 *    - 用于发送响应或回复（如果需要）
 * 
 * 配置选择建议：
 * - 标准配置：    内存 < 8GB，  一般测试使用
 * - 高性能配置：  内存 8-32GB， 高吞吐量测试
 * - 极限配置：    内存 > 32GB， 专业网络测试服务器
 * - 自定义配置：  根据具体需求调整
 */

// 配置1：标准配置 (推荐用于一般测试)
#define UDP_BUFFER_CONFIG_STANDARD

// 配置2：高性能配置 (推荐用于大内存系统 >16GB)
//#define UDP_BUFFER_CONFIG_HIGH_PERFORMANCE

// 配置3：极限性能配置 (推荐用于专用服务器 >32GB)
//#define UDP_BUFFER_CONFIG_EXTREME

// 配置4：自定义配置
//#define UDP_BUFFER_CONFIG_CUSTOM

// 根据配置设置缓冲区参数
#ifdef UDP_BUFFER_CONFIG_STANDARD
    #define UDP_MAX_PACKET_SIZE    65536     // 64KB
    #define UDP_BUFFER_COUNT       16        // 16个缓冲区
    #define UDP_SYSTEM_RCV_BUFFER  (8*1024*1024)   // 8MB
    #define UDP_SYSTEM_SND_BUFFER  (1*1024*1024)   // 1MB
#elif defined(UDP_BUFFER_CONFIG_HIGH_PERFORMANCE)
    #define UDP_MAX_PACKET_SIZE    65536     // 64KB (UDP最大实用大小)
    #define UDP_BUFFER_COUNT       64        // 64个缓冲区
    #define UDP_SYSTEM_RCV_BUFFER  (64*1024*1024)  // 64MB
    #define UDP_SYSTEM_SND_BUFFER  (8*1024*1024)   // 8MB
#elif defined(UDP_BUFFER_CONFIG_EXTREME)
    #define UDP_MAX_PACKET_SIZE    65536     // 64KB
    #define UDP_BUFFER_COUNT       256       // 256个缓冲区
    #define UDP_SYSTEM_RCV_BUFFER  (256*1024*1024) // 256MB
    #define UDP_SYSTEM_SND_BUFFER  (32*1024*1024)  // 32MB
#elif defined(UDP_BUFFER_CONFIG_CUSTOM)
    // 自定义配置 - 用户可在此修改
    #define UDP_MAX_PACKET_SIZE    65536     
    #define UDP_BUFFER_COUNT       32        
    #define UDP_SYSTEM_RCV_BUFFER  (32*1024*1024)
    #define UDP_SYSTEM_SND_BUFFER  (4*1024*1024)
#else
    // 默认使用标准配置
    #define UDP_MAX_PACKET_SIZE    65536
    #define UDP_BUFFER_COUNT       16
    #define UDP_SYSTEM_RCV_BUFFER  (8*1024*1024)
    #define UDP_SYSTEM_SND_BUFFER  (1*1024*1024)
#endif

// RIO配置
#ifdef _WIN32
// ASIO_HAS_WINDOWS_REGISTERED_IO
#endif

#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <chrono>
#include <atomic>
#include <asio.hpp>
#include <set>
#include <cstdint>  // 添加此头文件以支持INT32_MAX等常量

#ifdef _WIN32
#include <windows.h>
#endif

// 使用简化的命名空间
using asio::ip::udp;

class UdpReceiver {
public:
    // 构造函数，初始化socket并开始接收
    UdpReceiver(asio::io_context& io_context, unsigned short port);
    
    // 获取统计信息
    void print_statistics();
    
    // 停止接收
    void stop();

private:
    void do_receive();
    void start_statistics_timer();
    void setup_signal_handling();
    void handle_signal(const asio::error_code& error, int signal_number);
    void setup_optimized_buffers();
    
#ifdef _WIN32
    // Windows Control-C处理
    static BOOL WINAPI console_ctrl_handler(DWORD ctrl_type);
    static UdpReceiver* instance_; // 静态实例指针用于信号处理
#endif
    
    asio::io_context& io_context_;
    udp::socket socket_;
    udp::endpoint sender_endpoint_;
    
    // 信号处理
    asio::signal_set signals_;
    
    // 统计相关
    std::atomic<uint64_t> total_bytes_received_{0};
    std::atomic<uint64_t> total_packets_received_{0};
    std::chrono::steady_clock::time_point start_time_;
    
    // 间隔统计相关
    uint64_t last_bytes_received_{0};
    uint64_t last_packets_received_{0};
    std::chrono::steady_clock::time_point last_statistics_time_;
    
    // 新增：状态跟踪变量
    bool first_packet_received_{false};
    bool client_connected_{false};
    std::string client_ip_;
    unsigned short client_port_{0};
    size_t packet_size_{0};
    std::chrono::steady_clock::time_point last_receive_time_;
    std::chrono::steady_clock::time_point test_start_time_;
    
#ifdef ENABLE_IPERF2_ANALYSIS
    // 新增：iperf2数据包解析相关
    struct IperfHeader {
        uint32_t sequence_number;
        uint32_t timestamp_sec;
        uint32_t timestamp_usec;
    };
    
    std::set<uint32_t> received_sequences_;
    uint32_t min_sequence_{UINT32_MAX};
    uint32_t max_sequence_{0};
    uint32_t duplicate_packets_{0};
    uint32_t out_of_order_packets_{0};
    uint32_t last_sequence_{0};
    bool sequence_initialized_{false};
    
    // 解析iperf2数据包头部
    bool parse_iperf_header(const char* data, size_t size, IperfHeader& header);
    
    // 分析iperf2数据包格式的辅助函数
    void analyze_iperf_packet_format(const char* data, size_t size, size_t packet_count);
#endif
    
    // 优化的缓冲区管理
    static constexpr size_t max_length = UDP_MAX_PACKET_SIZE;  // 使用宏定义
    static constexpr size_t buffer_count = UDP_BUFFER_COUNT;   // 使用宏定义
    
    // 多缓冲区存储
    std::vector<std::vector<char>> buffer_pool_;
    
    // 定时器用于定期打印统计信息
    asio::steady_timer statistics_timer_;
    std::atomic<bool> running_{true};
    std::atomic<size_t> current_buffer_index_{0};
};
